package problems.daily;

/**
 * 1003. 检查替换后的词是否有效
 * <p>https://leetcode.cn/problems/check-if-word-is-valid-after-substitutions/</p>
 *
 * @author dubulingbo, 2023/05/03, 003 8:25.
 */
public class DT1003 {

    public boolean isValid1(String s) {
        char[] chs = s.toCharArray();
        int n = chs.length;
        // 模拟栈
        StringBuilder st = new StringBuilder();
        for (char ch : chs) {
            st.append(ch);
            int len = st.length();
            // 栈顶处的连续三个字符为 'a', 'b', 'c'
            if (len > 2 && "abc".equals(st.substring(len - 3))) {
                st.delete(st.length() - 3, st.length());
            }
        }

        return st.length() == 0;
    }

    public boolean isValid(String s) {
        /**
         * 原地修改数组 - 模拟栈
         */
        char[] chs = s.toCharArray();
        // 指向栈顶的指针
        int top = 0;
        for (char ch : chs) {
            // 如果 ch == 'b'，chs[top - 1] 必须为 'a'
            // 如果 ch == 'c'，chs[top - 1] 必须为 'b'
            if (ch > 'a' && (top == 0 || ch - chs[--top] != 1)) {
                return false;
            }

            if (ch < 'c') {
                // 入栈
                chs[top++] = ch;
            }
        }

        return top == 0;
    }

}
